Pandas xotira sarfini optimallashtirish bo'yicha keng qamrovli qo'llanma, ma'lumotlar turlari, bo'laklash, kategorik o'zgaruvchilar va katta ma'lumotlar to'plamini samarali boshqarish usullarini qamrab oladi.
Pandas Ishlash Optimizatsiyasi: Xotira Sarfini Kamaytirishni O'zlashtirish
Pandas - bu ma'lumotlarni tahlil qilish uchun kuchli Python kutubxonasi bo'lib, moslashuvchan ma'lumotlar tuzilmalari va ma'lumotlarni tahlil qilish vositalarini taqdim etadi. Biroq, katta ma'lumotlar to'plami bilan ishlaganda, xotira sarfi sezilarli darajada to'siq bo'lishi mumkin, bu esa ishlashga ta'sir qiladi va hatto dasturlaringizning buzilishiga olib kelishi mumkin. Ushbu keng qamrovli qo'llanma Pandas xotira sarfini optimallashtirishning turli usullarini o'rganadi, bu sizga katta ma'lumotlar to'plamini yanada samarali va ta'sirchan tarzda boshqarish imkonini beradi.
Pandas Xotira Sarfini Tushunish
Optimizatsiya usullariga kirishdan oldin, Pandas ma'lumotlarni xotirada qanday saqlashini tushunish juda muhimdir. Pandas asosan DataFrames va Series ichida ma'lumotlarni saqlash uchun NumPy massivlaridan foydalanadi. Har bir ustunning ma'lumotlar turi xotira iziga sezilarli ta'sir qiladi. Misol uchun, `int64` ustuni `int32` ustunidan ikki baravar ko'proq xotira sarflaydi.
Siz DataFrame-ning xotira sarfini .memory_usage() usuli yordamida tekshirishingiz mumkin:
import pandas as pd
data = {
'col1': [1, 2, 3, 4, 5],
'col2': ['A', 'B', 'C', 'D', 'E'],
'col3': [1.1, 2.2, 3.3, 4.4, 5.5]
}
df = pd.DataFrame(data)
memory_usage = df.memory_usage(deep=True)
print(memory_usage)
deep=True argumenti ob'ekt (string) ustunlarining xotira sarfini aniq hisoblash uchun zarur.
Xotira Sarfini Kamaytirish Usullari
1. To'g'ri Ma'lumotlar Turlarini Tanlash
Har bir ustun uchun mos ma'lumotlar turini tanlash xotira sarfini kamaytirishdagi eng muhim qadamdir. Pandas ma'lumotlar turlarini avtomatik ravishda aniqlaydi, lekin ko'pincha zarur bo'lganidan ko'ra ko'proq xotira talab qiladigan turlarni ishlatadi. Misol uchun, 0 dan 100 gacha bo'lgan butun sonlarni o'z ichiga olgan ustunga `int64` turi tayinlanishi mumkin, garchi `int8` yoki `uint8` yetarli bo'lsa ham.
Misol: Raqamli Turlarni Pasaytirish
Siz `pd.to_numeric()` funksiyasidan `downcast` parametri bilan foydalanib, raqamli turlarni kichikroq ko'rinishlarga pasaytirishingiz mumkin:
def reduce_mem_usage(df):
"""Iterate through all the columns of a dataframe and modify the data type
to reduce memory usage.
"""
start_mem = df.memory_usage().sum() / 1024**2
print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
for col in df.columns:
if df[col].dtype == 'object':
continue # Skip strings, handle them separately
col_type = df[col].dtype
if col_type in ['int64','int32','int16']:
c_min = df[col].min()
c_max = df[col].max()
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16)
elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.int32)
else:
df[col] = df[col].astype(np.int64)
elif col_type in ['float64','float32']:
c_min = df[col].min()
c_max = df[col].max()
if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
df[col] = df[col].astype(np.float16)
elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
df[col] = df[col].astype(np.float32)
else:
df[col] = df[col].astype(np.float64)
end_mem = df.memory_usage().sum() / 1024**2
print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
return df
Misol: Stringlarni Kategorik Turlarga O'tkazish
Agar ustunda cheklangan miqdordagi noyob string qiymatlari bo'lsa, uni kategorik turga o'tkazish xotira sarfini sezilarli darajada kamaytirishi mumkin. Kategorik turlar noyob qiymatlarni faqat bir marta saqlaydi va ustundagi har bir elementni noyob qiymatlarga ishora qiluvchi butun sonli kod sifatida ifodalaydi.
df['col2'] = df['col2'].astype('category')
Global elektron tijorat platformasi uchun xaridorlarning tranzaksiyalari ma'lumotlar to'plamini ko'rib chiqing. 'Mamlakat' ustunida atigi bir necha yuzta noyob mamlakat nomlari bo'lishi mumkin, ma'lumotlar to'plamida esa millionlab tranzaksiyalar mavjud. 'Mamlakat' ustunini kategorik turga o'tkazish xotira sarfini keskin kamaytiradi.
2. Bo'laklash va Iteratsiya
Xotiraga sig'maydigan juda katta ma'lumotlar to'plami bilan ishlaganda, siz pd.read_csv() yoki pd.read_excel() da chunksize parametrini ishlatib, ma'lumotlarni bo'laklarga bo'lib ishlashingiz mumkin. Bu sizga ma'lumotlarni kichikroq, boshqarish mumkin bo'lgan qismlarga yuklash va qayta ishlash imkonini beradi.
for chunk in pd.read_csv('large_dataset.csv', chunksize=100000):
# Process the chunk (e.g., perform calculations, filtering, aggregation)
print(f"Processing chunk with {len(chunk)} rows")
# Optionally, append results to a file or database.
Misol: Katta Log Fayllarini Qayta Ishlash
Global tarmoq infratuzilmasidan olingan katta log faylini qayta ishlashni tasavvur qiling. Log fayli xotiraga sig'maydigan darajada katta. Bo'laklashdan foydalanib, siz log fayli bo'ylab iteratsiya qilishingiz, har bir bo'lakni muayyan hodisalar yoki naqshlar uchun tahlil qilishingiz va xotira chegaralaridan oshib ketmasdan natijalarni jamlashingiz mumkin.
3. Faqat Kerakli Ustunlarni Tanlash
Ko'pincha, ma'lumotlar to'plamida sizning tahlilingizga aloqador bo'lmagan ustunlar mavjud. Faqat kerakli ustunlarni yuklash xotira sarfini sezilarli darajada kamaytirishi mumkin. Siz pd.read_csv() da usecols parametrini ishlatib, kerakli ustunlarni belgilashingiz mumkin.
df = pd.read_csv('large_dataset.csv', usecols=['col1', 'col2', 'col3'])
Misol: Savdo Ma'lumotlarini Tahlil Qilish
Agar siz eng yaxshi sotilayotgan mahsulotlarni aniqlash uchun savdo ma'lumotlarini tahlil qilayotgan bo'lsangiz, sizga faqat 'Mahsulot ID', 'Sotish Miqdori' va 'Sotish Daromadi' ustunlari kerak bo'lishi mumkin. Faqat shu ustunlarni yuklash butun ma'lumotlar to'plamini yuklash bilan solishtirganda xotira sarfini kamaytiradi, bu esa mijozlarning demografiyasi, yetkazib berish manzillari va boshqa aloqador bo'lmagan ma'lumotlarni o'z ichiga olishi mumkin.
4. Siyrak Ma'lumotlar Tuzilmalaridan Foydalanish
Agar sizning DataFrame-da ko'plab yetishmayotgan qiymatlar (NaNs) yoki nollar bo'lsa, ma'lumotlarni yanada samaraliroq ifodalash uchun siyrak ma'lumotlar tuzilmalaridan foydalanishingiz mumkin. Siyrak DataFrames faqat yetishmayotgan yoki nolga teng bo'lmagan qiymatlarni saqlaydi, bu siyrak ma'lumotlar bilan ishlaganda xotira sarfini sezilarli darajada kamaytiradi.
sparse_series = df['col1'].astype('Sparse[float]')
sparse_df = sparse_series.to_frame()
Misol: Mijozlarning Baholarini Tahlil Qilish
Katta miqdordagi mahsulotlar uchun mijozlarning baholari ma'lumotlar to'plamini ko'rib chiqing. Ko'pgina mijozlar faqat mahsulotlarning kichik to'plamiga baho berishadi, natijada siyrak baholar matritsasi hosil bo'ladi. Ushbu ma'lumotlarni saqlash uchun siyrak DataFrame-dan foydalanish zich DataFrame-ga nisbatan xotira sarfini sezilarli darajada kamaytiradi.
5. Ma'lumotlarni Nusxalashdan Saqlanish
Pandas operatsiyalari ba'zan DataFrames nusxalarini yaratishi mumkin, bu esa xotira sarfini oshishiga olib keladi. DataFrame-ni joyida o'zgartirish (imkon qadar) keraksiz nusxalashdan qochishga yordam beradi.
Misol uchun, o'rniga:
df = df[df['col1'] > 10]
Quyidagidan foydalanishni ko'rib chiqing:
df.drop(df[df['col1'] <= 10].index, inplace=True)
`inplace=True` argumenti DataFrame-ni nusxa yaratmasdan to'g'ridan-to'g'ri o'zgartiradi.
6. String Saqlashni Optimizatsiya Qilish
String ustunlar sezilarli xotira sarflashi mumkin, ayniqsa ular uzun stringlarni yoki ko'plab noyob qiymatlarni o'z ichiga olgan bo'lsa. Stringlarni kategorik turlarga o'tkazish, yuqorida aytib o'tilganidek, samarali usullardan biridir. Yana bir yondashuv - iloji bo'lsa, kichikroq string ko'rinishlaridan foydalanish.
Misol: String Uzunligini Qisqartirish
Agar ustunda string sifatida saqlangan, lekin butun sonlar sifatida ifodalanishi mumkin bo'lgan identifikatorlar bo'lsa, ularni butun sonlarga o'tkazish xotirani tejashga yordam beradi. Misol uchun, hozirda "PROD-1234" kabi stringlar sifatida saqlangan mahsulot ID-larini butun sonli ID-larga xaritalash mumkin.
7. Xotiradan Katta Ma'lumotlar To'plami Uchun Daskdan Foydalanish
Hatto bo'laklash bilan ham xotiraga sig'maydigan ma'lumotlar to'plami uchun Daskdan foydalanishni ko'rib chiqing. Dask - bu Pandas va NumPy bilan yaxshi integratsiyalashgan parallel hisoblash kutubxonasi. U sizga katta hajmdagi ma'lumotlar to'plami bilan ularni kichikroq bo'laklarga bo'lish va ularni bir nechta yadroda yoki hatto bir nechta mashinada parallel ravishda qayta ishlash orqali ishlash imkonini beradi.
import dask.dataframe as dd
ddf = dd.read_csv('large_dataset.csv')
# Perform operations on the Dask DataFrame (e.g., filtering, aggregation)
result = ddf[ddf['col1'] > 10].groupby('col2').mean().compute()
compute() usuli haqiqiy hisoblashni ishga tushiradi va natijalarni o'z ichiga olgan Pandas DataFrame-ni qaytaradi.
Eng Yaxshi Amaliyotlar va Mulohazalar
- Kodingizni Profilaktika Qiling: Xotira bo'shliqlarini aniqlash va optimallashtirish harakatlaringizni eng ta'sirchan sohalarga qaratish uchun profiling vositalaridan foydalaning.
- Turli Usullarni Sinovdan O'tkazing: Xotirani kamaytirishning optimal usuli sizning ma'lumotlar to'plamingizning o'ziga xos xususiyatlariga bog'liq. O'z foydalanish holatingiz uchun eng yaxshi yechimni topish uchun turli yondashuvlar bilan tajriba o'tkazing.
- Xotira Sarfini Kuzatib Boring: Optimallashtirish samarali ekanligiga ishonch hosil qilish va xotira yetishmasligi xatolarining oldini olish uchun ma'lumotlarni qayta ishlash vaqtida xotira sarfini kuzatib boring.
- Ma'lumotlaringizni Tushuning: Ma'lumotlaringizni chuqur tushunish eng mos ma'lumotlar turlari va optimallashtirish usullarini tanlash uchun juda muhimdir.
- Savdo-sotiqni Hisobga Oling: Ba'zi xotirani optimallashtirish usullari biroz ishlash xarajatlarini keltirib chiqarishi mumkin. Xotira sarfini kamaytirishning afzalliklarini potentsial ishlash ta'siriga qarshi torting.
- Optimizatsiyangizni Hujjatlashtiring: Kodingiz saqlanib qolishi va boshqalar tomonidan tushunarli bo'lishini ta'minlash uchun amalga oshirgan xotirani optimallashtirish usullarini aniq hujjatlashtiring.
Xulosa
Pandas xotira sarfini optimallashtirish katta ma'lumotlar to'plami bilan samarali va samarali ishlash uchun zarurdir. Pandas ma'lumotlarni qanday saqlashini tushunish, to'g'ri ma'lumotlar turlarini tanlash, bo'laklashdan foydalanish va boshqa optimallashtirish usullaridan foydalanish orqali siz xotira sarfini sezilarli darajada kamaytirishingiz va ma'lumotlarni tahlil qilish ish jarayonining ishlashini yaxshilashingiz mumkin. Ushbu qo'llanma Pandas-da xotira sarfini kamaytirishni o'zlashtirish uchun asosiy usullar va eng yaxshi amaliyotlarning keng qamrovli ko'rinishini taqdim etdi. O'z foydalanish holatingiz uchun eng yaxshi natijalarga erishish uchun kodingizni profilaktika qilishni, turli usullarni sinovdan o'tkazishni va xotira sarfini kuzatib borishni unutmang. Ushbu printsiplarni qo'llash orqali siz Pandas-ning to'liq salohiyatini ochishingiz va hatto eng talabchan ma'lumotlarni tahlil qilish muammolarini ham hal qilishingiz mumkin.
Ushbu usullarni o'zlashtirib, dunyo bo'ylab ma'lumotlar olimlari va tahlilchilari katta ma'lumotlar to'plami bilan ishlashlari, qayta ishlash tezligini yaxshilashlari va o'z ma'lumotlaridan chuqurroq tushunchalarga ega bo'lishlari mumkin. Bu yanada samarali tadqiqotlarga, yaxshiroq asoslangan biznes qarorlariga va oxir-oqibat, ma'lumotlarga asoslangan dunyoga hissa qo'shadi.